<?php if ( ! defined('BASEPATH')) exit('No se permite acceso directo al script');
class Util_historial_plan {
	public function obtenerPeriodo($fecha)
	{
		$periodo = 0;
		if($fecha != "") {
			$fecha = str_replace("/", "-", $fecha); # Estandarizo el formato de la fecha. Si se usan '/' lo reemplazo por '-'
			$partes_fecha = explode("-", $fecha); # Formato de fecha: AAAA-MM-DD o DD-MM-AAAA

			if($partes_fecha > 2) {
				$anio = strlen($partes_fecha[0]) == 4 ? $partes_fecha[0] : $partes_fecha[2];
				$mes = $partes_fecha[1];
				
				$periodo = $anio . $mes;
			}
		}
		return $periodo;
	}

	public function getProximoPeriodo($periodo)
	{
		$proximo_periodo = 0;
		if(strlen($periodo) == 6) {
			$mes = substr($periodo, 4);

			if($mes != '12') $proximo_periodo = $periodo + 1; #Mismo año, próximo mes
			else $proximo_periodo = $periodo + 89; #Sumando 89, paso al año siguiente, mes 01
		}

		return $proximo_periodo;
	}

	public function getPeriodoIntervalo($periodo_inicial, $cant_meses)
	{
		$meses_generados = 0;
		$periodo = $periodo_inicial;
		while ($meses_generados < $cant_meses) {
			$periodo = $this->getProximoPeriodo($periodo);
			$meses_generados += 1;
		}

		return $periodo;
	}

	public function getUltimoPeriodoPlan($fecha_inicio, $cant_meses_duracion)
	{
		$periodo = $this->obtenerPeriodo($fecha_inicio);
		$meses_generados = 1; #Corresponde al período inicial
		while ($meses_generados < $cant_meses_duracion) {
			$periodo = $this->getProximoPeriodo($periodo);
			$meses_generados += 1;
		}

		return $periodo;
	}

	/* A partir de un historial plan, se obtiene un listado de las prestaciones aún pendientes (inclusive las extra), y un 
	listado de las ya consumidas. La función devuelve un arreglo con estos dos listados, donde la clave de cada elemento
	es 'consumidas', 'pendientes' y 'pendientes_extra' */
	public function getDetallePrestaciones($objHistorialPlan)
	{
		$array_prestaciones = array(); #Vector que contendrá el resultado: prestaciones pendientes y consumidas

		# Obtengo todas las presaciones ya consumidas
		$prest_consumidas = $objHistorialPlan->cobertura->get_iterated();

		# Almaceno en un vector, la cantidad consumida agrupadas por prestación. Ej: 2 vacuna X, 3 consulta, 1 baño.
		# La clave del vector será el id de prestación, y el valor será la cantidad de consumos
		$cantConsumidasPorPrestacion = array();
		foreach ($prest_consumidas as $consumida) {
			$clave = $consumida->prestacion_id;

			// Busco si ya existe un elemento con la misma clave (la clave es prestacion_id)
			if(array_key_exists($clave, $cantConsumidasPorPrestacion))
				$cantConsumidasPorPrestacion[$clave] += 1;
			else $cantConsumidasPorPrestacion[$clave] = 1;
		}

		// Obtengo todas las prestaciones que define el plan, más todas las prestaciones extras definidas para el historial plan,
		// para mapear con las consumidas y saber cuáles le quedan pendientes
		$objPlanPrestacion = new Plan_prestacion();
		$objPlanPrestacion->where('plan_id', $objHistorialPlan->plan_id);
		$prest_plan = $objPlanPrestacion->get();
		$prest_pendientes = $this->getArregloPendientes($prest_plan, $cantConsumidasPorPrestacion);

		$objPrestacionExtra = new Prestacion_extra();
		$objPrestacionExtra->where('historial_plan_id', $objHistorialPlan->id);
		$prest_plan = $objPrestacionExtra->get();
		$prest_pendientes_extra = $this->getArregloPendientes($prest_plan, $cantConsumidasPorPrestacion);

		$array_prestaciones['pendientes'] = $prest_pendientes;
		$array_prestaciones['pendientes_extra'] = $prest_pendientes_extra;
		$array_prestaciones['consumidas'] = $prest_consumidas;
		return $array_prestaciones;
	}

	private function getArregloPendientes($prest_plan, $cantConsumidasPorPrestacion)
	{
		$prest_pendientes = array();
		foreach ($prest_plan as $prestacionPlan) {
			$clave = $prestacionPlan->prestacion_id;

			// Valido si la prestación actual fue consumida al menos alguna vez (estaría en el vector de cantConsumidasPorPrestacion)
			if(array_key_exists($clave, $cantConsumidasPorPrestacion))
			{
				# Hubo consumo de esta prestación. Controlo si se consumieron todas o quedan pendientes
				$cantidadPendientes = $prestacionPlan->cantidad - $cantConsumidasPorPrestacion[$clave];
				if($cantidadPendientes < 0) $cantidadPendientes = 0;

				if($cantidadPendientes > 0 || $prestacionPlan->ilimitadas) # Quedan prestaciones pendientes o son ilimitadas
				{
					$prestacionPlan->cantidad = $cantidadPendientes;
					$prest_pendientes[] = $prestacionPlan;		
				}
			}
			else { 
				$prest_pendientes[] = $prestacionPlan; #Está pendiente completa de consumo 
			}
		}

		return $prest_pendientes;
	}

	public function getIdHistorialPlanActual($id_afiliado)
	{
		$fechaActual = date('Y-m-d');

		#Buscar el historial_plan cuya fecha de inicio sea la mayor, pero anterior a la fecha actual
		$obj_hist_plan = new Historial_plan();
		$obj_hist_plan->where('afiliado_id', $id_afiliado);
		$obj_hist_plan->where('fecha_inicio <=', $fechaActual);
		$obj_hist_plan->limit(1);
		$obj_hist_plan->order_by('fecha_inicio', 'desc');
		$obj_hist_plan->get();

		if($obj_hist_plan->exists())
		{
			$obj_hist_plan->plan->get();

			#El plan está vigente si la duración del plan respecto de la fecha de inicio incluye la fecha actual
			# Duración del plan: desde la fecha de inicio, hasta fecha de inicio + cantidad de meses de duración del plan
			$primer_periodo_vigencia = $this->obtenerPeriodo($obj_hist_plan->fecha_inicio);
			$ultimo_periodo_vigencia = $this->getUltimoPeriodoPlan($obj_hist_plan->fecha_inicio, $obj_hist_plan->plan->cant_meses_duracion);
			$periodo_fecha_actual = $this->obtenerPeriodo($fechaActual);

			if($periodo_fecha_actual >= $primer_periodo_vigencia &&
			   $periodo_fecha_actual <= $ultimo_periodo_vigencia) return $obj_hist_plan->id;
			else return 0; #No hay planes vigentes
		}
		else return 0; #No se encontraron planes con fecha de inicio anterior a la actual
	}
}
/* Fin del archivo */